package cn.highedu.coolshark_product.controller;

import cn.highedu.coolshark_product.pojo.dto.AdminAddNewDTO;
import cn.highedu.coolshark_product.pojo.dto.AdminLoginInfoDTO;
import cn.highedu.coolshark_product.pojo.vo.AdminListItemVO;
import cn.highedu.coolshark_product.pojo.vo.AdminLoginInfoVO;
import cn.highedu.coolshark_product.pojo.vo.AdminStandardVO;
import cn.highedu.coolshark_product.pojo.vo.JwtVO;
import cn.highedu.coolshark_product.security.UserDetailsImpl;
import cn.highedu.coolshark_product.service.IAdminService;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 处理管理员相关操作控制器类
 */
@RestController
@RequestMapping("/admins")
@Slf4j
@Api(tags = "管理员用户相关接口")
public class AdminController {
    @Autowired
    private IAdminService adminService;

    @PreAuthorize("hasAuthority('/ams/admin/add-new')")
    @PostMapping("/add-new")
    @ApiOperation("添加管理员")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "adminAddNewDTO", value = "管理员信息", required = true,
            dataTypeClass = AdminAddNewDTO.class)
    })
    @ApiResponse(code = 20000, message = "ok", response = JsonResult.class)
    public JsonResult<Void> addNew(@RequestBody AdminAddNewDTO adminAddNewDTO) {
        log.debug("开始处理[添加管理员]的请求, 参数:{}", adminAddNewDTO);
        adminService.addNew(adminAddNewDTO);
        return JsonResult.ok();
    }
    @PreAuthorize("hasAuthority('/ams/admin/delete')")
    @DeleteMapping("/{id}")
    public JsonResult<Void> delete(@PathVariable Long id) {
        log.debug("开始处理[删除管理员]的请求, 参数:{}", id);
        adminService.delete(id);
        return JsonResult.ok();
    }
    @PostMapping("/delete-all")
    public JsonResult<Void> delete(@RequestBody Long[] ids) {
        log.debug("开始批量处理[删除管理员]的请求, 参数:{}", ids);
        adminService.delete(ids);
        return JsonResult.ok();
    }

    /**
     * 根据id查询管理员信息
     */
    @GetMapping("/{id}")
    public JsonResult<AdminStandardVO> getById(@PathVariable Long id) {
        log.debug("开始处理[根据id查询管理员信息]的请求, 参数:{}", id);
        AdminStandardVO admin = adminService.getAdminById(id);
        return JsonResult.ok(admin);
    }

    /**
     * 查询所有管理员
     */
    @GetMapping("/list")
    public JsonResult<List<AdminListItemVO>> list() {
        log.debug("开始处理[查询所有管理员]的操作, 参数:无");
        List<AdminListItemVO> admins = adminService.list();
        return JsonResult.ok(admins);
    }
    /**
     * 为管理员添加角色
     */
    @PostMapping("/{adminId}/add-roles")
    public JsonResult<Void> addRoles(@PathVariable Long adminId, @RequestBody Long[] roleIds) {
        log.debug("开始处理[为管理员分配角色]的操作, 参数:{}", roleIds);
        adminService.addRoles(adminId, roleIds);
        return JsonResult.ok();
    }

    /**
     * 根据用户名查询用户信息
     */
    @GetMapping("/{username}/info")
    public JsonResult<AdminLoginInfoVO> getAdminLoginInfo(@PathVariable String username) {
        log.debug("开始处理[根据用户名查询用户信息]的操作, 参数:{}", username);
        AdminLoginInfoVO admin = adminService.getAdminLoginInfo(username);
        return JsonResult.ok(admin);
    }

    /**
     * 登录方法
     */
    @PostMapping("/login")
    @ApiOperation("管理员登录")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "adminLoginInfoDTO", value = "管理员登录信息", required = true,
            dataTypeClass = AdminLoginInfoDTO.class)
    })
    @ApiResponse(code = 20000, message = "ok", response = JsonResult.class)
    public JsonResult<JwtVO> login(@RequestBody AdminLoginInfoDTO adminLoginInfoDTO) {
        log.debug("开始处理[管理员登录]的请求, 参数: {}", adminLoginInfoDTO);
        JwtVO jwtVO = adminService.login(adminLoginInfoDTO);
        return JsonResult.ok(jwtVO);
    }
    @GetMapping("/info")
    public JsonResult<AdminStandardVO> getInfo(@AuthenticationPrincipal UserDetailsImpl userDetails) {
        log.debug("开始处理[根据token查询管理员信息]的请求, 参数:{}", userDetails);
        AdminLoginInfoVO adminLoginInfoVO = userDetails.getAdmin();
        AdminStandardVO admin = adminService.getAdminById(adminLoginInfoVO.getId());
        log.debug("管理员信息: {}", admin);
        return JsonResult.ok(admin);
    }
}
